//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES.
//
//
// (C) Copyright 2006 Marvell International Ltd.
// All Rights Reserved
//

#include <windows.h>
#include <ceddk.h>
#include "pdd_private.h"
#include "qci.h"

void CCameraPdd::qci_clock_enable(BOOL is_on)
{
    DWORD bytes_return;

    BusIoControl(qci_bus, IOCTL_QCI_CLOCK_ENABLE,
                 (LPVOID)&is_on, sizeof(is_on),
                 NULL, 0,
                 &bytes_return,
                 NULL);
}


// to access qci bus driver
void CCameraPdd::qci_enable()
{
    DWORD bytes_return;
    BusIoControl(qci_bus, IOCTL_QCI_ENABLE,
                 NULL, 0,
                 NULL, 0,
                 &bytes_return,
                 NULL);
}

void CCameraPdd::qci_start_capture(int still_skips)
{
    DWORD bytes_return;
    BusIoControl(qci_bus, IOCTL_QCI_START_CAPTURE,
                 (LPVOID)&still_skips, sizeof(still_skips),
                 NULL, 0,
                 &bytes_return,
                 NULL);
}

void CCameraPdd::qci_stop_capture()
{
    DWORD bytes_return;
    BusIoControl(qci_bus, IOCTL_QCI_STOP_CAPTURE,
                 NULL, 0,
                 NULL, 0,
                 &bytes_return,
                 NULL);
}

void CCameraPdd::qci_set_master_timing(qci_master_timing_t* timing)
{
    DWORD bytes_return;

    BusIoControl(qci_bus, IOCTL_QCI_SET_MASTER_TIMING,
                 (LPVOID)timing, sizeof(*timing),
                 NULL, 0,
                 &bytes_return,
                 NULL);
}

void CCameraPdd::qci_set_image_format(int in_format, int out_format)
{
    DWORD bytes_return;
    int input[2];
    input[0] = in_format;
    input[1] = out_format;

    BusIoControl(qci_bus, IOCTL_QCI_SET_IMAGE_FORMAT,
                 (LPVOID)input, sizeof(input),
                 NULL, 0,
                 &bytes_return,
                 NULL);
}

void CCameraPdd::qci_set_interface(qci_interface_t* qci_interface)
{
    DWORD bytes_return;

    BusIoControl(qci_bus, IOCTL_QCI_SET_INTERFACE,
                 (LPVOID)qci_interface, sizeof(*qci_interface),
                 NULL, 0,
                 &bytes_return,
                 NULL);
}

void CCameraPdd::qci_set_capture_callback(capture_callback_t callback, 
                                          ULONG user, 
                                          ULONG mode)
{    
    DWORD bytes_return;
    callback_data_t callback_data = {
        callback,
        user,
        mode,
        &qci_frame
    };

    BusIoControl(qci_bus, IOCTL_QCI_SET_CAPTURE_CALLBACK,
                 (LPVOID)&callback_data, sizeof(callback_data),
                 NULL, 0,
                 &bytes_return,
                 NULL);
}

void CCameraPdd::qci_notify_formats(format_t* format)
{
    DWORD bytes_return;

    BusIoControl(qci_bus, IOCTL_QCI_NOTIFY_FORMAT,
                 (LPVOID)format, sizeof(*format),
                 NULL, 0,
                 &bytes_return,
                 NULL);
}

void CCameraPdd::qci_set_frame_format(format_t* format)
{
    DWORD bytes_return;

    BusIoControl(qci_bus, IOCTL_QCI_SET_FRAME_FORMAT,
                 (LPVOID)format, sizeof(*format),
                 NULL, 0,
                 &bytes_return,
                 NULL);
}

void CCameraPdd::qci_set_image_proc_cfg(qci_image_proc_cfg_t* cfg)
{
    DWORD bytes_return;

    BusIoControl(qci_bus, IOCTL_QCI_SET_IMAGE_PROC_CFG,
                 (LPVOID)cfg, sizeof(*cfg),
                 NULL, 0,
                 &bytes_return,
                 NULL);
}